<?php
namespace app\Home\controller;

//公共控制器
use app\common\controller\Homecontroller;

// 导入Cookie
use think\Cookie;

class Comment extends Homecontroller {
    public function __construct() {
        // 手动把父类的方法获取过来
        parent::__construct();
        $this->UserModel = model( 'User.User' );
        $this->PostModel = model( 'Post.Post' );
        $this->CommentModel = model( 'Post.Comment' );
        $this->CollectModel = model( 'User.Collect' );
        $this->RecordModel = model( 'User.Record' );
    }

    // 添加评论

    public function add() {
        if ( $this->request->isPost() ) {
            // 获取表单传来的值
            $params = $this->request->param();

            // 获取此帖子的信息
            $postinfo = $this->PostModel->find( $params[ 'postid' ] );

            // 判断帖子不存在
            if ( !$postinfo ) {
                $this->error( '帖子不存在！' );
                exit;
            }

            // 判断帖子是否被采纳，若被采纳不能评论
            if ( $postinfo[ 'accept' ] ) {
                $this->error( '该帖子已经被采纳，无需评论' );
                exit;
            }

            if ( empty( $params[ 'content' ] ) ) {
                $this->error( '请输入评论内容' );
                exit;
            }

            // 获取父级用户的id
            $pid = $this->request->param( 'pid', 0 );

            // 获取上一级的评论信息
            $comment = $this->CommentModel->find( $pid );

            // 根据是否有上一级评论来设置评论的等级
            if ( $comment ) {
                $level = $comment[ 'level' ] + 1;
                // 有上一级评论，则将本身的等级在父级的等级上加一
            } else {
                $level = 0;
                // 没有上一级，则自己的为第一条评论
            }

            // 将评论信息组装
            $data = [
                'pid' => $pid,
                'content' => $params[ 'content' ],
                'userid' => $this->LoginUser[ 'id' ],
                'postid' => $params[ 'postid' ],
                'level' => $level,
            ];

            $result = $this->CommentModel->save( $data );

            if ( $result == false ) {
                // 插入失败
                $this->error( $this->CommentModel->getError() );
                exit;
            } else {
                // 插入成功
                $this->success( '评论成功', url( 'home/index/info', [ 'postid' => $params[ 'postid' ] ] ) );
            }
        }

    }

    // 点赞

    public function thumbs() {
        if ( $this->request->isPost() ) {
            // 提示信息
            $success = [
                'result' => false,
                'msg' => '',
            ];

            // 获取传来的 评论id
            $commentId = $this->request->param( 'id' );

            // 获取数据库中 评论的信息
            $commentInfo = $this->CommentModel->find( $commentId );

            // 判断是否存在此条评论
            if ( !$commentInfo ) {
                $success[ 'msg' ] = '此评论不存在';
                return $success;
                exit;
            }

            // 获取所有点赞过这条评论的用户id
            $visitStr = trim( $commentInfo[ 'like' ] );
            // 将所有用户id字符串转换为数组
            $visitArr = explode( ',', $visitStr );
            // 去除数组的空数值
            $visitArr = array_filter( $visitArr );

            // 得到当前登录 用户的id
            $userId = $this->LoginUser[ 'id' ];

            // 判断当前登录 用户id是否在评论信息里面
            if ( in_array( $userId, $visitArr ) ) {
                // 点赞过

                // 删除当前 登陆用户id
                foreach ( $visitArr as $key => $item ) {
                    if ( $userId == $item ) {
                        // 删除
                        unset( $visitArr[ $key ] );
                    }
                }

                // 组装数据
                $data = [
                    'id' => $commentId,
                    'like' => implode( ',', $visitArr ),
                ];

                // 更新评论表
                $result = $this->CommentModel->isUpdate()->save( $data );

                // 判断点赞是否成功
                if ( $result === false ) {
                    // 删除失败
                    $success[ 'msg' ] = $this->PostModel->getError();
                } else {
                    // 删除成功
                    $success[ 'result' ] = true;
                    $success[ 'msg' ] = '取消点赞成功！';
                }
                return $success;

            } else {
                // 没点赞过

                // 添加当前 登陆用户id
                $visitArr[] = $userId;

                // 组装数据
                $data = [
                    'id' => $commentId,
                    'like' => implode( ',', $visitArr ),
                ];

                // 更新评论表
                $result = $this->CommentModel->isUpdate()->save( $data );

                // 判断点赞是否成功
                if ( $result === false ) {
                    // 删除失败
                    $success[ 'msg' ] = $this->PostModel->getError();
                } else {
                    // 删除成功
                    $success[ 'result' ] = true;
                    $success[ 'msg' ] = '点赞成功！';
                }
                return $success;
            }

        }

    }

    // 采纳

    public function accept() {
        if ( $this->request->isPost() ) {
            // 提示信息
            $success = [
                'result' => false,
                'msg' => ''
            ];

            // 获取评论传过来的评论id
            $commentId = $this->request->param( 'comid' );

            // 单条评论的全部信息
            $commentInfo = $this->CommentModel->find( $commentId );

            // 判断评论是否存在
            if ( !$commentInfo ) {
                $success[ 'msg' ] = '该评论不存在！';
                return $success;
                exit;
            }

            // 获取帖子的全部信息
            $postInfo = $this->PostModel->find( $commentInfo[ 'postid' ] );

            // 判断帖子是否存在
            if ( !$postInfo ) {
                $success[ 'msg' ] = '该帖子不存在';
                return $success;
                exit;
            }

            // 判断帖子是否已经被采纳了
            if ( $postInfo[ 'accept' ] ) {
                $success[ 'msg' ] = '该帖子已采纳，无需在采纳';
                return $success;
                exit;
            }

            // 获取当前登陆的用户id
            $userId = $this->LoginUser[ 'id' ];

            // 获取登陆用户的全部信息
            $userInfo = $this->UserModel->find( $commentInfo[ 'userid' ] );

            // 判断这条帖子是否是登录的人发的 不是登录的人，不能采纳
            if ( $postInfo[ 'userid' ] != $userId ) {
                $success[ 'msg' ] = '没有权限采纳！';
                return $success;
                exit;
            }

            /* 开启事务 */
            $this->PostModel->startTrans();
            $this->CommentModel->startTrans();
            $this->UserModel->startTrans();
            $this->RecordModel->startTrans();

            // 帖子表的信息组装
            $postData = [
                'id' => $postInfo[ 'id' ],
                'accept' => $commentInfo[ 'userid' ],
            ];

            // 帖子表的更新
            $postRes = $this->PostModel->isUpdate()->save( $postData );

            if ( $postRes === false ) {
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 评论表信息的组装
            $commentData = [
                'id' => $commentId,
                'accept' => 1,
            ];

            // 更新评论表
            $commentRes = $this->CommentModel->isUpdate()->save( $commentData );

            if ( $commentRes === false ) {
                $this->PostModel->rollback();
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 用户id相加
            $updatePoint = bcadd( $userInfo[ 'point' ], $postInfo[ 'point' ] );

            // 组装用户信息
            $userData = [
                'id' => $userInfo[ 'id' ],
                'point' => $updatePoint,
            ];

            // 更新用户表
            $userRes = $this->UserModel->isUpdate()->save( $userData );

            if ( $userRes === false ) {
                $this->PostModel->rollback();
                $this->CommentModel->rollback();
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 根据附加功能类型去配置表里面查询相对的积分
            $StatePoint = $this->ConfigModel->where( [ 'key' => "PostState{$postInfo['state']}" ] )->value( 'value' );

            // 判断是否有附加功能配置，若没有 则为0
            $StatePoint = is_numeric( $StatePoint ) ? abs( $StatePoint ) : 0;

            // 发布帖子的附加功能类型
            $state = intval( $postInfo[ 'state' ] );

            // 通过附加功能类型给积分消费表的内容封装
            switch( $state ) {
                case 1:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ]."积分</b> 置顶：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                case 2:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ]."积分</b> 精华：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                case 3:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ]."积分</b> 热门：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                default:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ].'积分</b>  - 发布时间：'.date( 'Y-m-d H:i' );
                break;
            }

            // 组装积分消费信息
            $recordData = [
                'point' => $postInfo[ 'point' ],
                'content' => $recordContent,
                'state' => 2,
                'userid' => $postInfo[ 'userid' ]
            ];

            // 插入信息到积分消费表
            $recordRes = $this->RecordModel->save( $recordData );

            if ( $recordRes === false ) {
                $this->PostModel->rollback();
                $this->CommentModel->rollback();
                $this->UserModel->rollback();
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 最终判断
            if ( $postRes === false || $commentRes === false || $userRes === false || $recordRes === false ) {
                $this->PostModel->rollback();
                $this->CommentModel->rollback();
                $this->UserModel->rollback();
                $this->RecordModel->rollback();
                $success[ 'msg' ] = '采纳失败，请重新选择';
                return json( $success );
            } else {
                // 提交事务
                $this->PostModel->commit();
                $this->CommentModel->commit();
                $this->UserModel->commit();
                $this->RecordModel->commit();
                $success[ 'result' ] = true;
                $success[ 'msg' ] = '采纳成功，帖子完结';
                return json( $success );
            }
        }
    }

    // 取消采纳

    public function noaccept() {
        if ( $this->request->isPost() ) {
            // 提示信息
            $success = [
                'result' => false,
                'msg' => ''
            ];

            // 获取评论传过来的评论id
            $commentId = $this->request->param( 'comid' );

            // 单条评论的全部信息
            $commentInfo = $this->CommentModel->find( $commentId );

            // 判断评论是否存在
            if ( !$commentInfo ) {
                $success[ 'msg' ] = '该评论不存在！';
                return $success;
                exit;
            }

            // 获取帖子的全部信息
            $postInfo = $this->PostModel->find( $commentInfo[ 'postid' ] );

            // 判断帖子是否存在
            if ( !$postInfo ) {
                $success[ 'msg' ] = '该帖子不存在';
                return $success;
                exit;
            }

            // 判断帖子是否已经被采纳了
            if ( empty( $postInfo[ 'accept' ] ) ) {
                $success[ 'msg' ] = '该帖子没被采纳，取消不了采纳';
                return $success;
                exit;
            }

            // 获取当前登陆的用户id
            $userId = $this->LoginUser[ 'id' ];

            // 获取登陆用户的全部信息
            $userInfo = $this->UserModel->find( $commentInfo[ 'userid' ] );

            // 判断这条帖子是否是登录的人发的 不是登录的人，不能采纳

            if ( $postInfo[ 'userid' ] != $userId ) {
                $success[ 'msg' ] = '没有权限操作！';
                return $success;
                exit;
            }

            /* 开启事务 */
            $this->PostModel->startTrans();
            $this->CommentModel->startTrans();
            $this->UserModel->startTrans();
            $this->RecordModel->startTrans();

            // 帖子表的信息组装
            $postData = [
                'id' => $postInfo[ 'id' ],
                'accept' => null,
            ];

            // 帖子表的更新
            $postRes = $this->PostModel->isUpdate()->save( $postData );

            if ( $postRes === false ) {
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 评论表信息的组装
            $commentData = [
                'id' => $commentId,
                'accept' => 0,
            ];

            // 更新评论表
            $commentRes = $this->CommentModel->isUpdate()->save( $commentData );

            if ( $commentRes === false ) {
                $this->PostModel->rollback();
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 用户id相加
            $updatePoint = bcsub( $userInfo[ 'point' ], $postInfo[ 'point' ] );

            // 组装用户信息
            $userData = [
                'id' => $userInfo[ 'id' ],
                'point' => $updatePoint,
            ];

            // 更新用户表
            $userRes = $this->UserModel->isUpdate()->save( $userData );

            if ( $userRes === false ) {
                $this->PostModel->rollback();
                $this->CommentModel->rollback();
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 根据附加功能类型去配置表里面查询相对的积分
            $StatePoint = $this->ConfigModel->where( [ 'key' => "PostState{$postInfo['state']}" ] )->value( 'value' );

            // 判断是否有附加功能配置，若没有 则为0
            $StatePoint = is_numeric( $StatePoint ) ? abs( $StatePoint ) : 0;

            // 发布帖子的附加功能类型
            $state = intval( $postInfo[ 'state' ] );

            // 通过附加功能类型给积分消费表的内容封装
            switch( $state ) {
                case 1:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ]."积分</b> 置顶：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                case 2:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ]."积分</b> 精华：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                case 3:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ]."积分</b> 热门：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                default:
                $recordContent = '【'.$postInfo[ 'title' ].'】采纳积分：<b>'.$postInfo[ 'point' ].'积分</b>  - 发布时间：'.date( 'Y-m-d H:i' );
                break;
            }

            // 组装积分消费信息
            $recordData = [
                'point' => $postInfo[ 'point' ],
                'content' => $recordContent,
                'state' => 2,
                'userid' => $postInfo[ 'userid' ]
            ];

            // 插入信息到积分消费表
            $recordRes = $this->RecordModel->save( $recordData );

            if ( $recordRes === false ) {
                $this->PostModel->rollback();
                $this->CommentModel->rollback();
                $this->UserModel->rollback();
                $success[ 'msg' ] = $this->PostModel->getError();
                return json( $success );
            }

            // 最终判断
            if ( $postRes === false || $commentRes === false || $userRes === false || $recordRes === false ) {
                $this->PostModel->rollback();
                $this->CommentModel->rollback();
                $this->UserModel->rollback();
                $this->RecordModel->rollback();
                $success[ 'msg' ] = '取消采纳失败，请重新选择';
                return json( $success );
            } else {
                // 提交事务
                $this->PostModel->commit();
                $this->CommentModel->commit();
                $this->UserModel->commit();
                $this->RecordModel->commit();
                $success[ 'result' ] = true;
                $success[ 'msg' ] = '取消采纳成功，帖子完结';
                return json( $success );
            }
        }
    }

    // 删除评论

    public function delComment() {
        // 封装提示信息
        $Tips = [
            'result' => false,
            'msg' => '',
        ];

        // 获取传来的评论id
        $commentId = $this->request->param( 'comid', 0 );

        // 查询数据库是否有这条评论
        $commentInfo = $this->CommentModel->find( $commentId );

        // 判断该评论是否存在
        if ( !$commentInfo ) {
            $Tips[ 'msg' ] = '该评论不存在';
            return json( $Tips );
        }

        $data = $this->delChilds( $commentInfo );

        // // 软删除
        $result = $this->CommentModel->destroy( $commentId );

        if ( $result === FALSE ) {
            $Tips[ 'result' ] = false;
            $Tips[ 'msg' ] = $this->ConfigModel->getError();
        } else {
            $Tips[ 'result' ] = true;
            $Tips[ 'msg' ] = '删除评论成功';
        }

        return $Tips;
    }

    function delChilds( $list ) {

        $pid = $list[ 'id' ];

        $childrenInfo = $this->CommentModel->where( [ 'pid' => $pid ] )->find();

        if ( $childrenInfo ) {

            $result = $this->CommentModel->destroy( $childrenInfo[ 'id' ] );

            if ( $result === FALSE ) {
                //修改失败
                $this->error( $this->CommentModel->getError() );
                exit;
            }

            $this->delChilds( $childrenInfo );
        }

        return '123';

    }
}

?>